package org.iamd.util;

import java.math.BigInteger;

/**
 * Помощен клас за валидация на низове.
 * 
 * @author И. Атанасов
 */
public class StringUtils {

	/**
	 * Escape-ва текст като заменя специалните HTML символи с escape-нати
	 * такива.
	 * 
	 * @param text
	 *            входен низ
	 * 
	 * @return резултантния низ след обработката
	 */
	public static String escape(String text) {
		if (text != null) {
			StringBuilder escapedText = new StringBuilder();
			for (int i = 0; i < text.length(); i++) {
				char ch = text.charAt(i);
				if (ch == '<') {
					escapedText.append("&lt;");
				} else if (ch == '>') {
					escapedText.append("&gt;");
				} else if (ch == '&') {
					escapedText.append("&amp;");
				} else if (ch == '\"') {
					escapedText.append("&quot;");
				} else if (ch == '\n') {
					escapedText.append(", ");
				} else if (ch == '\r') {
					escapedText.append(" ");
				} else {
					escapedText.append(ch);
				}
			}
			return escapedText.toString();
		}
		return null;
	}

	/**
	 * @param text
	 *            входен низ
	 * 
	 * @return дали въведеният email е коректен
	 */
	public static boolean isCorrectEmail(String text) {
		return text.matches("^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+"
				+ "(\\.[A-Za-z0-9-]+)*(\\.[_A-Za-z0-9-]+)");
	}

	/**
	 * Проверява дали низът се състои само от малки, големи латински букви и/или
	 * цифри.
	 * 
	 * @param text
	 *            входен низ
	 * 
	 * @return дали е изпълнено условието
	 */
	public static boolean isCorrectName(String text) {
		return text.matches("[a-zA-Z0-9]+");
	}

	/**
	 * @param text
	 *            входен низ
	 * 
	 * @return true ако низа е <code>null</code> или празен (с дължина 0 или
	 *         състоящ се само от whitespaces)
	 */
	public static boolean isEmpty(String text) {
		return text == null || text.trim().equals("");
	}

	/**
	 * Проверява дали низът е валиден номер.
	 * 
	 * @param text
	 *            входен низ
	 * 
	 * @return <code>true</code> ако това е така
	 */
	public static boolean isNumber(String text) {
		try {
			BigInteger bigInt = new BigInteger(text);
			return bigInt.compareTo(BigInteger.ZERO) >= 0;
		} catch (Exception e) {
			return false;
		}
	}

	/**
	 * Валидира дали въведеният низ е валиден IP адрес.
	 * 
	 * @param text
	 *            входен низ
	 * 
	 * @return code>true</code> ако това е така
	 */
	public static boolean isNumberIP(String text) {
		return text.matches("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}"
				+ "([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$");
	}

}